import pygame
import sys
from pygame.locals import *
import random
#参考程序地址：https://coderslegacy.com/python/python-pygame-tutorial/  的  Game Creation – Part 1
#参考文档地址：https://www.pygame.org/docs/ref/surface.html?highlight=blit#pygame.Surface.blit
#2021-05-17 查阅和修改参考程序
#2021-05-18 15:53   完善注释信息    by  炸天帮成员

pygame.init()

FPS=60
FramePerSec = pygame.time.Clock()

BLUE=(0,0,255)
RED=(255,0,0)
GREEN=(0,255,0)
BLACK=(0,0,0)
WHITE=(255,255,255)

SCREEN_WIDTH=400
SCREEN_HEIGHT=600
DISPLAYSURF=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
print('DISPLAYSURF 类型为： ',type(DISPLAYSURF))    #   可以看到，这东西最终为pygame.Surface对象。
DISPLAYSURF.fill(WHITE)
pygame.display.set_caption("Game")

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()  #   用于完全继承pygame.sprite.Sprite的__init__()
        self.image = pygame.image.load("enemy.png") #   用于设置加载至pygame.Rect对象的image路径，将在Surface.blit()中被实装。
        self.surf = pygame.Surface((50,79)) #   这个参数一般是对应上述图片的像素，创建一个pygame.Surface对象，可用于显示image
        print('self.surf 类型为： ',type(self.surf),self.surf)
        self.rect = self.surf.get_rect(center=(random.randint(40,360),0))   #   这行的操作就是将之前self.surf的pygame.Surface对象转换为pygame.Rect对象。
                                                                            #   pygame.Rect对象具有center等属性可以被赋值。
        print('self.rect 类型为： ',type(self.rect),self.rect)

    def move(self):
        self.rect.move_ip(0,10) #   move_ip:move in place   即每次移动上次的相对位置(in place)
        if (self.rect.bottom >SCREEN_HEIGHT):   #   如果pygame.Rect对象的bottom底部数值大于窗口参数最大值
            self.rect.top = 0                   # 则将pygame.Rect对象的top顶部数值设置为窗口的Y轴0处，即从窗口的开始处出现
            self.rect.center = (random.randint(30,370),0)#  设置pygame.Rect对象的中心点起始位置，X轴为随机坐标
    
    def draw(self,surface):
        surface.blit(self.image,self.rect)      # 即可以将第一个参数视为皮肤，即意味着将皮肤装载至第二个参数（pygame.Rect对象，即可视为RECT碰撞模型）上。bilt()位于pygame.Surface.blit()中。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("download.png")
        self.surf = pygame.Surface((50,29)) #   这个参数一般是指上述图片的大小。此句用于创建可以显示图像的pygame.Surface对象。
        self.rect = self.surf.get_rect()    #   将pygame.Surface对象转换为pygame.Rect对象。

    def update(self):
        pressed_keys = pygame.key.get_pressed() #   pygame自带的检测键盘输入指令，结果为一个元组。
        #print('pressed_keys = ',pressed_keys)
        #if pressed_keys[K_UP]:
            #self.rect.move_ip(0,-5)
        #if pressed_keys[K_DOWN]:
            #self.rect.move_ip(0,5)
        self.rect.top = 500         #   这个可以用来规定Player的图标出现在Y轴的哪个位置上。即 设置pygame.Rect对象的top起始位置。
        if self.rect.left > 0:
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5,0)
                print('self.rect.left= ',self.rect.left)#   这个函数可以得到图片左侧的坐标
                print('self.rect.top= ',self.rect.top)
                #   从结果来看，每次按键按下，这个函数至少能读到3~7次，也就是说，视游戏情况，可能要写个消抖函数。
        if self.rect.right < SCREEN_WIDTH:
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5,0)
    def draw(self,surface):
        surface.blit(self.image,self.rect)

P1 = Player()
E1 = Enemy()
 
while True:     #   pygame主循环。
    for event in pygame.event.get():    #   当触发退出事件时             
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    P1.update() #pygame.Rect对象位置移动
    E1.move()   #pygame.Rect对象位置移动
     
    DISPLAYSURF.fill(WHITE) #窗口底色绘制
    P1.draw(DISPLAYSURF)    #image皮肤装载至pygame.Rect对象中
    E1.draw(DISPLAYSURF)    #image皮肤装载至pygame.Rect对象中
         
    pygame.display.update() #pygame显示全局刷新
    FramePerSec.tick(FPS)   #pygame刷新频率